iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
Rust

大家一起跟Rust當好朋友吧!系列 第 7

Day 7: 第一週回顧與 Cargo 工具鏈:掌握 Rust 開發的瑞士軍刀

  • 分享至 

  • xImage
  •  

嗨嗨!大家好!歡迎來到 Rust 三十天挑戰的第七天!

恭喜你!我們已經完成了第一週的學習旅程。經過六天的密集學習,相信你已經對 Rust 已經有了基本的認識。今天我們要來回顧這一週學到的核心概念,並深入探索 Cargo 這個讓 Rust 開發變得如此便利的強大工具。

第一週學習回顧

讓我們先來回顧一下這一週的重要里程碑:

Day 1-3:語法基礎

核心概念

  • Rust 的三大優勢:效能、記憶體安全、併發安全
  • 變數宣告與型別系統:letmut、型別推導
  • 函式定義與流程控制:fnifloopmatch
  • 表達式 vs 陳述句的重要區別

實戰技能

// 我們學會了這些基本語法
fn main() {
    let name = "Rust";
    let mut counter = 0;
    
    for i in 1..=5 {
        counter += i;
        if counter > 10 {
            println!("{} 的counter超過 10 了!", name);
            break;
        }
    }
}

Day 4-5:記憶體管理

核心概念

  • 所有權的三大規則
  • 移動語意 vs 複製語意
  • 參考與借用:&T&mut T
  • 借用檢查器的黃金規則
// 從這樣的困惑...
fn take_ownership(s: String) { /* s 被移動了! */ }

// 到這樣的理解!
fn borrow_value(s: &String) -> usize { s.len() }
fn modify_value(s: &mut String) { s.push_str("!"); }

Day 6:自訂型別

核心概念

  • 結構:組織相關資料
  • Enum:表達多種可能性
  • Option<T>:安全的處理空值
  • match 模式匹配

設計思維的轉變

// 從物件導向思維...
// class User { ... }

// 到資料優先的設計!
struct User {
    username: String,
    email: String,
    active: bool,
}

impl User {
    fn new(username: String, email: String) -> Self {
        User { username, email, active: true }
    }
}

Cargo:Rust 的開發工具

現在讓我們深入探索 Cargo。如果你曾經使用過 npm、pip、或 NuGet,你會發現 Cargo 融合了它們的優點。

Cargo 的核心功能

Cargo 是一個「多合一」的工具,它集合了:

  • 專案管理:建立、組織專案結構
  • 建置系統:編譯 Rust 程式碼
  • 套件管理:下載、管理相依性
  • 測試執行器:執行各種測試
  • 文件生成器:生成 API 文件
  • 發布工具:將套件發布到 crates.io

專案結構深度解析

讓我們建立一個新專案來詳細了解 Cargo 的專案結構:

cargo new my_rust_blog --bin
cd my_rust_blog

這會建立以下結構:

my_rust_blog/
├── Cargo.toml          # 專案設定檔(類似 package.json)
├── Cargo.lock          # 鎖定相依性版本(類似 package-lock.json)
├── src/
│   └── main.rs         # 進入點
└── target/             # 編譯輸出目錄(由 cargo build 產生)

Cargo.toml:專案的心臟

Cargo.toml 是整個專案的設定中心,以下是我簡單整理出來的例子:

專案管理指令

建立新專案

# 建立可執行檔專案
cargo new my_project --bin

# 建立函式庫專案
cargo new my_library --lib

專案資訊

# 顯示專案後設資料
cargo metadata

# 檢查專案結構
cargo tree         # 顯示相依性樹狀圖
cargo tree -i serde # 顯示誰依賴 serde

建置與執行指令

基本建置

# 編譯專案(Debug 模式)
cargo build

# 編譯專案(Release 模式)
cargo build --release

# 只檢查語法,不產生執行檔
cargo check

# 編譯並執行
cargo run

套件管理指令

新增相依性

# 新增最新版本
cargo add serde

# 新增特定版本
cargo add serde@1.0.100

移除與更新

# 移除套件
cargo remove serde

# 更新所有套件
cargo update

# 更新特定套件
cargo update serde

測試相關指令

執行測試

# 執行所有測試
cargo test

# 平行控制(單執行緒執行)
cargo test -- --test-threads=1

# 只執行忽略的測試
cargo test -- --ignored

程式碼品質

Linting 與格式化

# 格式化程式碼
cargo fmt

# 檢查格式化(CI 中常用)
cargo fmt --check

# 程式碼靜態分析
cargo clippy

# 更嚴格的 clippy 檢查
cargo clippy -- -D warnings

文件與發布指令

文件生成

# 生成文件
cargo doc

# 生成並開啟文件
cargo doc --open

實戰演練:建立一個完整的專案

讓我們建立一個實際的專案來練習這些指令:讓我們建立這個專案並實際操作:

# 1. 建立專案
cargo new cargo_practice --bin
cd cargo_practice

# 2. 新增套件
cargo add serde --features derive
cargo add serde_json

# 3. 之前寫過的程式碼拿來用

# 4. 檢查程式碼
cargo check

# 5. 執行程式
cargo run

# 6. 執行測試
cargo test

# 7. 格式化程式碼
cargo fmt

# 8. 程式碼分析
cargo clippy

# 9. 生成文件
cargo doc --open

工作區 (Workspaces) 管理

當專案變大時,我們可能想要將其分割成多個小套件。Cargo 的工作區功能讓我們可以管理多個相關的套件:工作區的優勢:

  • 共享套件:所有成員套件共享同一個 Cargo.lock
  • 統一建置:可以一次建置整個工作區
  • 內部相依:成員之間可以輕鬆相互參考
  • 統一設定:共享建置設定檔案
# 建立工作區專案
cargo new blog-workspace
cd blog-workspace

# 建立成員套件
cargo new blog-core --lib
cargo new blog-api --bin
cargo new blog-cli --bin

# 在根目錄執行所有測試
cargo test

# 建置整個工作區
cargo build

# 執行特定成員
cargo run -p blog-api

今天的收穫

今天我們簡單探索了Cargo,當然有關於Cargo還有許多好用功能我沒有特別提到,目前就簡單介紹一定會使用到的幾個命令XD。

第一週回顧重點

  • ✅ 掌握 Rust 基本語法與型別系統
  • ✅ 理解所有權、借用與生命週期概念
  • ✅ 學會使用結構和列舉設計資料模型
  • ✅ 建立起 Rust 程式設計的思維模式

Cargo 工具鏈

  • 專案管理:創建、初始化、組織專案結構
  • 套件管理:新增、更新、移除套件
  • 建置與測試:編譯、執行、測試
  • 程式碼品質:格式化、靜態分析、安全檢查
  • 進階功能:工作區

為第二週做準備

  • 環境設定完善,工具鏈熟練
  • 專案結構清晰,開發流程順暢
  • 準備深入學習更進階的 Rust 概念

下週預告

第二週我們將深入 Rust 的核心,學習更進階的概念:

  • Day 8:集合型別 - Vec, HashMap, String 深度探索
  • Day 9:錯誤處理 - 從 panic!Result<T, E> 的完整體系
  • Day 10:泛型 - 寫出彈性且抽象的程式碼
  • Day 11:特徵 (Traits) - Rust 的多型與行為抽象
  • Day 12:生命週期深度剖析 - 攻克最難的概念
  • Day 13:智慧指標 - Box, Rc, Arc 與記憶體管理
  • Day 14:測試 - 建立可靠的自動化測試體系

這些概念將為我們在第三週學習非同步程式設計和第四週的實戰專案打下堅實的基礎。

本週小挑戰

為了鞏固這一週的學習成果,有空的人也可以玩玩以下挑戰:

挑戰目標:建立一個個人任務管理系統

功能需求

  1. 任務結構:包含 id、標題、描述、狀態、優先順序、建立時間
  2. 狀態列舉:Todo, InProgress, Done
  3. 優先順序列舉:Low, Medium, High
  4. 任務管理器:新增、刪除、更新、查詢任務
  5. 過濾功能:按狀態、優先順序篩選任務
  6. 統計功能:計算各種狀態的任務數量

技術要求

  • 使用完整的 Cargo 專案結構
  • 實現結構方法和關聯函式
  • 使用 serde 進行 JSON 序列化
  • 簡單的錯誤處理
  • 程式碼必須通過 cargo fmtcargo clippy

提示:這個挑戰會用到我們這一週學到的所有概念,大家加油~

如果在實作過程中遇到任何問題,歡迎在留言區討論。記住,Rust 的學習可能稍微有點小難,但你一但學會了,就會特別開心XD

也恭喜完成我們大家第一週的學習!讓我們大家下周再見!


上一篇
Day 6: 結構 (Structs) 與列舉 (Enums):打造自己的資料型別
下一篇
Day 8: 集合型別:Vectors, Strings, Hash Maps - 理解動態的資料結構
系列文
大家一起跟Rust當好朋友吧!20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言